草庐IT

c++ - RAII 和 C++ STL

全部标签

c++ - RAII 与异常

我们在C++中使用RAII的次数越多,我们发现自己使用的析构函数就越多,这些析构函数会进行非平凡的释放。现在,解除分配(最终确定,但你想调用它)可能会失败,在这种情况下,异常确实是让楼上的任何人知道我们的解除分配问题的唯一方法。但是话又说回来,抛出析构函数是一个坏主意,因为在堆栈展开期间可能会抛出异常。std::uncaught_exception()让您知道何时发生这种情况,但仅此而已,因此除了让您在终止前记录消息之外,您无能为力,除非您愿意离开您的处于未定义状态的程序,其中一些东西被释放/最终确定,而另一些则没有。一种方法是使用无抛出析构函数。但在许多情况下,这只是隐藏了一个真正的

c++ - C++ STL unordered_map 如何解决冲突?

C++STLunordered_map如何解决冲突?查看http://www.cplusplus.com/reference/unordered_map/unordered_map/,它说“唯一键容器中的两个元素不能有等价的键。”这应该意味着容器确实在解决冲突。但是,该页面并没有告诉我它是如何做到的。我知道一些解决冲突的方法,比如使用链表和/或探测。我想知道的是c++STLunordered_map是如何解决的。 最佳答案 标准对此的定义比大多数人似乎意识到的要多一些。具体而言,标准要求(§23.2.5/9):Theelements

c++ - C++ STL unordered_map 如何解决冲突?

C++STLunordered_map如何解决冲突?查看http://www.cplusplus.com/reference/unordered_map/unordered_map/,它说“唯一键容器中的两个元素不能有等价的键。”这应该意味着容器确实在解决冲突。但是,该页面并没有告诉我它是如何做到的。我知道一些解决冲突的方法,比如使用链表和/或探测。我想知道的是c++STLunordered_map是如何解决的。 最佳答案 标准对此的定义比大多数人似乎意识到的要多一些。具体而言,标准要求(§23.2.5/9):Theelements

c++ - 在 C++/STL 中是否有与 Python range() 等效的紧凑函数

如何使用C++/STL执行以下等效操作?我想用一系列值[min,max)填充std::vector。#Python>>>x=range(0,10)>>>x[0,1,2,3,4,5,6,7,8,9]我想我可以使用std::generate_n并提供一个仿函数来生成序列,但我想知道是否有更简洁的方法来使用STL? 最佳答案 在C++11中,有std::iota:#include#include//std::iotaintmain(){std::vectorx(10);std::iota(std::begin(x),std::end(x)

c++ - 在 C++/STL 中是否有与 Python range() 等效的紧凑函数

如何使用C++/STL执行以下等效操作?我想用一系列值[min,max)填充std::vector。#Python>>>x=range(0,10)>>>x[0,1,2,3,4,5,6,7,8,9]我想我可以使用std::generate_n并提供一个仿函数来生成序列,但我想知道是否有更简洁的方法来使用STL? 最佳答案 在C++11中,有std::iota:#include#include//std::iotaintmain(){std::vectorx(10);std::iota(std::begin(x),std::end(x)

c++ - 如果增加一个等于 STL 容器的结束迭代器的迭代器会发生什么

如果当迭代器指向vector的最后一个元素时,我将迭代器增加2会怎样?在thisquestion询问如何通过2个元素将迭代器调整为STL容器,提供了两种不同的方法:使用算术运算符的一种形式-+=2或++两次或使用std::advance()当迭代器指向STL容器的最后一个元素或更远时,我已经使用VC++7测试了它们的边缘情况:vectorvec;vec.push_back(1);vec.push_back(2);vector::iteratorit=vec.begin();advance(it,2);boolisAtEnd=it==vec.end();//trueit++;//orad

c++ - 如果增加一个等于 STL 容器的结束迭代器的迭代器会发生什么

如果当迭代器指向vector的最后一个元素时,我将迭代器增加2会怎样?在thisquestion询问如何通过2个元素将迭代器调整为STL容器,提供了两种不同的方法:使用算术运算符的一种形式-+=2或++两次或使用std::advance()当迭代器指向STL容器的最后一个元素或更远时,我已经使用VC++7测试了它们的边缘情况:vectorvec;vec.push_back(1);vec.push_back(2);vector::iteratorit=vec.begin();advance(it,2);boolisAtEnd=it==vec.end();//trueit++;//orad

c++ - 如何在我的 dll 接口(interface)或 ABI 中使用标准库 (STL) 类?

在导出包含与VisualStudio警告C4251相关的STL类的类之前,有几个问题:例如这个问题或这个问题。我已经阅读了UnknownRoad上的精彩解释。盲目地禁用警告似乎有点危险,尽管它可能是一种选择。包装所有这些std类并导出它们也不是一个真正的选择。毕竟它被称为标准模板库...即,想要为这些标准类提供一个接口(interface)。如何在我的dll接口(interface)中使用STL类?有哪些常见做法? 最佳答案 在进一步阅读之前请记住一件事:我的回答来自编写可移植代码的角度,这些代码可用于由在不同编译器下编译的模块组成

c++ - 如何在我的 dll 接口(interface)或 ABI 中使用标准库 (STL) 类?

在导出包含与VisualStudio警告C4251相关的STL类的类之前,有几个问题:例如这个问题或这个问题。我已经阅读了UnknownRoad上的精彩解释。盲目地禁用警告似乎有点危险,尽管它可能是一种选择。包装所有这些std类并导出它们也不是一个真正的选择。毕竟它被称为标准模板库...即,想要为这些标准类提供一个接口(interface)。如何在我的dll接口(interface)中使用STL类?有哪些常见做法? 最佳答案 在进一步阅读之前请记住一件事:我的回答来自编写可移植代码的角度,这些代码可用于由在不同编译器下编译的模块组成

c++ - 为什么大多数 STL 实现中的代码如此复杂?

STL是C++世界的关键部分,大多数实现源自Stepanov和Musser的初步努力。我的问题是代码的重要性,它是人们出于敬畏和学习目的查看编写良好的C++示例的主要来源之一:为什么STL的各种实现看起来如此恶心-从美学的角度来看,如何不编写C++代码的复杂且通常很好的示例。下面的代码示例在我工作过的地方无法通过代码审查,原因多种多样,包括变量命名、布局、宏和运算符的使用,这些需要不仅仅是一眼就能弄清楚实际发生了什么。templateinlinebool_Next_permutation(_BidIt_First,_BidIt_Last){//permuteandtestforpure